package mpiserver;

import java.util.Vector;
import taskmanager.JTask;

/**
 * Класс для сопоставления pid с JTask
 * @author TrueWar
 * @see taskmanager.JTask
 */

public class Pid2JTask
{
	/**
	 * Класс, предоставляющий сопоставление JTask со всеми pid процессов
	 * указанной задачи.
	 */
	public class Link
	{
		/** Задача */
		public JTask task;
		/** Процессы задачи task */
		public Vector <Long> pids;

		/**
		 * Конструктор
		 * @param task ссылка на задачу.
		 */
		public Link(JTask task)
		{
			this.task = task;
			this.pids = new Vector <Long>();
		}
	}

	/** Набор всех задач с pid их процессов. */
	private Vector <Link> container;

	/**
	 * Конструктор.
	 */
	public Pid2JTask()
	{
		container = new Vector <Link>();
	}

	/**
	 * Добавление задачи в коллекцию.
	 * @param task ссылка на задачу.
	 * @return true, если задача добавлена, false, если такая задача уже
	 * существует.
	 */
	public boolean addTask(JTask task)
	{
		for(int i = 0; i < container.size(); i++)
		{
			if(container.get(i).task == task)
				return false;
		}
		container.add(new Link(task));
		return true;
	}

	/**
	 * Добавление pid к указаной задачи.
	 * @param task ссылка на задачу.
	 * @param pid идентификатор процесса.
	 * @return true, если pid добавлен, false, в случае, если такой задачи
	 * не существует в коллекции.
	 */
	public boolean addPidToTask(JTask task, long pid)
	{
		for(int i = 0; i < container.size(); i++)
		{
			if(container.get(i).task == task)
			{
				container.get(i).pids.add(new Long(pid));
				return true;
			}
		}
		return false;
	}

	/**
	 * Получение ссылки на задачу по одному из pid.
	 * @param pid идентификатор процесса.
	 * @return ссылка на задачу, если pid найден, иначе null.
	 */
	public JTask getJTaskByPid(long pid)
	{
		for(int i = 0; i < container.size(); i++)
		{
			for(int j = 0; j < container.get(i).pids.size(); j++)
			{
				if(container.get(i).pids.get(j) == pid)
				{
					return container.get(i).task;
				}
			}
		}
		return null;
	}

	/**
	 * Получение вектора, содержащего все pid указанной задачи.
	 * @param task ссылка на задачу.
	 * @return вектор pid, если задача найдена, иначе - false.
	 */
	public Vector<Long> getPidByJTaskInVector(JTask task)
	{
		for(int i = 0; i < container.size(); i++)
		{
			if(container.get(i).task == task)
			{
				return container.get(i).pids;
			}
		}

		return null;
	}
	/**
	 * Получение массива, содержащего все pid указанной задачи.
	 * @param task ссылка на задачу.
	 * @return массив pid, если задача найдена, иначе - false.
	 */
	public long[] getPidByJTaskInArray(JTask task)
	{
		for(int i = 0; i < container.size(); i++)
		{
			if(container.get(i).task == task)
			{
				long [] ret = new long[container.get(i).pids.size()];
				for(int j = 0; j < container.get(i).pids.size(); j++)
					ret[j] = container.get(i).pids.get(j);
				return ret;
			}
		}
		return null;
	}

	/**
	 * Удаление задачи.
	 * @param task ссылка на задачу для удаления.
	 * @return true, если задача удалена. false - если задача не найдена.
	 */
	public boolean removeJTask(JTask task)
	{
		for(int i = 0; i < container.size(); i++)
		{
			if(container.get(i).task == task)
			{
				container.remove(i);
				return true;
			}
		}
		return false;
	}
}
